package br.com.assinchronus.negocio;

import java.util.List;
import java.util.Map;

import br.com.assinchronus.componentes.Casa;
import br.com.assinchronus.componentes.Dama;
import br.com.assinchronus.componentes.Peao;

public class RegraGeral {

	private RegraPeao rp = new RegraPeao();
	private RegraDama rd = new RegraDama();

	public JogadasEnum verificaJogada(Casa[] tab, Casa casaInicial, Casa casaFinal, boolean sequencia) {
		JogadasEnum verifica;
		if (casaInicial.getPeca() instanceof Peao) {
			verifica = (rp.verificaJogada(casaInicial, casaFinal, tab, sequencia));
			if (verifica != JogadasEnum.INVALIDA) {
				atualizaTabuleiro(tab, casaInicial, casaFinal, verifica);
			}
		} else {
			verifica = (rd.verificaJogada(casaInicial, casaFinal, tab, sequencia));
			if (verifica != JogadasEnum.INVALIDA) {
				atualizaTabuleiro(tab, casaInicial, casaFinal, verifica);
			}
		}
		return verifica;
	}

	public void atualizaTabuleiro(Casa[] tab, Casa casaInicial, Casa casaFinal, JogadasEnum tipoJogada) {
		switch (tipoJogada) {
		// TODO Trocar COMER_BRANCA e COMER_PRETA por COMER
		case COMER:
			if (casaInicial.getPeca() instanceof Peao) {
				int adv = casaInicial.getPosicao() + (casaFinal.getPosicao() - casaInicial.getPosicao()) / 2;
				casaInicial.getPeca().comer(casaInicial, tab[adv], casaFinal);
				break;
			} else if (casaInicial.getPeca() instanceof Dama) {
				int dif = casaFinal.getPosicao() - casaInicial.getPosicao();
				int s = 0;
				if (dif > 0) {
					if (dif % 5 == 0 && dif % 4 == 0 || dif % 4 == 0) {
						s = 4;
					} else if (dif % 5 == 0) {
						s = 5;
					}
				} else {
					if (dif % 5 == 0 && dif % 4 == 0 || dif % 4 == 0) {
						s = -4;
					} else if (dif % 5 == 0) {
						s = -5;
					}
				}
				
				if (dif == 20) {
					switch (casaInicial.getPosicao()) {
					case 3:
					case 4:
					case 8:
					case 12:
					case 13:
						s = 4;
						break;
					case 1:
					case 2:
					case 5:
					case 6:
					case 10:
					case 11:
					case 14:
					case 15:
						s = 5;
						break;
					default:
						break;
					}
				} else if (dif == -20) {
					switch (casaInicial.getPosicao()) {
					case 23:
					case 24:
					case 28:
					case 32:
					case 33:
						s = -4;
						break;
					case 21:
					case 22:
					case 25:
					case 26:
					case 30:
					case 31:
					case 34:
					case 35:
						s = -5;
						break;
					default:
						break;
					}
				}
				
				if (casaInicial.getPosicao() + s <= casaFinal.getPosicao()) {
					for (int i = casaInicial.getPosicao() + s; i <= casaFinal.getPosicao(); i += s) {
						if (i % 9 != 0 && tab[i].getPeca() != null) {
							casaInicial.getPeca().comer(casaInicial, tab[i], casaFinal);
							break;
						}
					}
				} else {
					for (int i = casaInicial.getPosicao() + s; i >= casaFinal.getPosicao(); i += s) {
						if (i % 9 != 0 && tab[i].getPeca() != null) {
							casaInicial.getPeca().comer(casaInicial, tab[i], casaFinal);
							break;
						}
					}
				}
				break;
			}
		case MOVER_BRANCA:
		case MOVER_PRETA:
			casaInicial.getPeca().mover(casaInicial, casaFinal);
			break;
		case MOVER_DAMA:
			casaInicial.getPeca().mover(casaInicial, casaFinal);
			break;
		}
	}

	public List<Casa> verificaSequencia(Casa casaAtual, Casa[] tab) {
		List<Casa> retorno = null;
		if (casaAtual.getPeca() instanceof Peao) {
			retorno = rp.verificaSequencia(casaAtual, tab);
		} else if (casaAtual.getPeca() instanceof Dama) {
			retorno = rd.verificaSequencia(casaAtual, tab);
		}
		return retorno;
	}

	public Map<Casa, List<Casa>> verificaObrigatoria(Casa tab[], int cor) {
		Map<Casa, List<Casa>> verificaObrigatoria = rp.verificaObrigatoria(tab, cor);
		verificaObrigatoria.putAll(rd.verificaObrigatoria(tab, cor));

		return verificaObrigatoria;
	}
}
